9762 analysis

Andrew Portuguese
January 25, 2024

Setup and data wrangling

Load necessary packages

Show code

Read in the data

Show code
db1 = read_excel(path = "9762 data for analysis 1.23.24.xlsx", sheet = "Survival")

dataset <- db1 %>%
  mutate(
    dx_dt = ymd(dx_dt),
    infuse_dt = ymd(infuse_dt),
    birthdate = ymd(birthdate),
    dt_relapse = ymd(dt_relapse),
    Death.or.DLC = ymd(Death.or.DLC),
    Death.or.relapse.or.DLC = ymd(Death.or.relapse.or.DLC),
    Days.to.death.or.DLC = Death.or.DLC - infuse_dt,
    Days.to.death.or.relapse.or.DLC = Death.or.relapse.or.DLC - infuse_dt,
    Days.from.dx.to.infusion = infuse_dt - dx_dt,
    Age = (infuse_dt-birthdate)/365
  )

Data tables

Table 1 reproduction

Show code
theme_gtsummary_compact()


dataset %>%
  transmute(
    "Age (years)" = Age,
    "Female sex" = ifelse(sex == "f", 1, 0),
    "Race" = recode(race, "asian" = "Asian", "white" = "White"),
    "ECOG performance status" = ecog,
    "Median time from diagnosis to CAR T cell therapy" = Days.from.dx.to.infusion/365,
    "Disease subtype" = factor(subtype_category, levels = c("IgA", "IgG", "IgM", "Light chain", "Oligosecretory", "Primary plasma cell leukemia")),
    "ISS disease stage at diagnosis" = iss,
    "Revised ISS disease stage at diagnosis" = riss,
    "ISS disease stage at enrollment" = iss_enrollment,
    "Revised ISS disease stage at enrollment" = riss_enrollment,
    #"High-risk cytogenetic abnormality at any time" = HRCA,
    "t(4;14) any" = t414_any,
    "t(14;16) any" = t1416_any,
    "del(17p) any" = del17p_any,
    "amp(1q) any" = amp1q_any,
    "High bone marrow tumor burden" = ifelse(High.tumor.burden == 1, ">30%", "10-30%"),
    "Extramedullary disease" = extramedullary,
    "Circulating plasma cells at screening" = cpcs,
    "Tumor BCMA expression (ABC)" = bcma_scrn,
    "Number of previous antimyeoma regimens" = factor(case_when(
      no_priortx <=6 ~ "4-6",
      no_priortx >6 & no_priortx <=9 ~ "7-9",
      no_priortx >9 ~ "10 or more"), levels = c("4-6", "7-9", "10 or more") ),
    "Previous autologous HCT" = factor(case_when(
      no_auto == 0 ~ "0",
      no_auto == 1 ~ "1",
      no_auto >1 ~ ">1"), levels = c("0","1",">1") ),
    "Previous allogeneic HCT" = allo
  ) %>%
  
  tbl_summary(
    missing = "ifany",
    statistic = list(
      all_continuous() ~ "{median} ({min} to {max})",
      all_categorical() ~ "{n} ({p}%)"
    )
  ) %>%
  bold_labels() %>%
  add_variable_grouping(
    "High-risk cytogenetic abnormality at any time" = c("t(4;14) any", "t(14;16) any", "del(17p) any", "amp(1q) any")
  )
Characteristic N = 251
Age (years) 64 (38 to 77)
Female sex 9 (36%)
Race
    Asian 3 (12%)
    White 22 (88%)
ECOG performance status
    0 5 (20%)
    1 17 (68%)
    2 3 (12%)
Median time from diagnosis to CAR T cell therapy 5.1 (1.6 to 14.6)
Disease subtype
    IgA 4 (16%)
    IgG 13 (52%)
    IgM 2 (8.0%)
    Light chain 3 (12%)
    Oligosecretory 1 (4.0%)
    Primary plasma cell leukemia 2 (8.0%)
ISS disease stage at diagnosis
    1 4 (20%)
    2 6 (30%)
    3 10 (50%)
    Unknown 5
Revised ISS disease stage at diagnosis
    1 2 (18%)
    2 3 (27%)
    3 6 (55%)
    Unknown 14
ISS disease stage at enrollment
    1 12 (63%)
    2 5 (26%)
    3 2 (11%)
    Unknown 6
Revised ISS disease stage at enrollment
    1 6 (32%)
    2 11 (58%)
    3 2 (11%)
    Unknown 6
High-risk cytogenetic abnormality at any time
    t(4;14) any 2 (8.0%)
    t(14;16) any 2 (8.0%)
    del(17p) any 13 (52%)
    amp(1q) any 3 (12%)
High bone marrow tumor burden
    >30% 17 (68%)
    10-30% 8 (32%)
Extramedullary disease 11 (44%)
Circulating plasma cells at screening 5 (20%)
Tumor BCMA expression (ABC) 620 (175 to 5,521)
Number of previous antimyeoma regimens
    4-6 6 (24%)
    7-9 13 (52%)
    10 or more 6 (24%)
Previous autologous HCT
    0 5 (20%)
    1 13 (52%)
    >1 7 (28%)
Previous allogeneic HCT 5 (20%)
1 Median (Range); n (%)

Survival analysis

Length of follow-up

Show code
data1 = dataset %>%
  mutate(
    Reverse_death = ifelse(death == 1, 0,1)
  )

#quantile(prodlim(Hist(time = Real.days.DLC/30, Real.death )~1, data = data1, reverse = TRUE ) )


reverse_km_OS <- survfit(Surv(Days.to.death.or.DLC/30, Reverse_death) ~ 1, data1)
reverse_km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, Reverse_death) ~ 
    1, data = data1)

      n events median 0.95LCL 0.95UCL
[1,] 25      6   58.6    47.4      NA

Create KM for OS and PFS

Show code
km_OS <- survfit(Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
) 

OS$plot <- OS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_OS$median + 0.5, y = 0.54, label = paste(signif(med_OS$median, 2), "(95% CI, ", signif(med_OS$lower, 2), "to", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5)
OS
Show code
km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     19   32.1    20.4      NA
Show code
summary(km_OS,times=c(12))
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     22       3     0.88   0.065        0.761            1
Show code
km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 1, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste(signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)
PFS
Show code
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 
    1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     22     18    8.73    27.5
Show code
summary(km_PFS,times=c(12))
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 
    1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     16       9     0.64   0.096        0.477        0.859

PFS and OS on the same plot

Show code
OS_EFS <- ggsurvplot_combine(list(km_PFS, km_OS),
           data=db,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.3,
           tables.theme = theme_cleantable(),
           surv.median.line = "hv", # Specify median survival
           ggtheme = theme_classic()+
            theme(
              axis.text.x = element_text(size = 12),  # Increase x-axis label font size
              axis.text.y = element_text(size = 12),  # Increase y-axis label font size
              axis.title.x = element_text(size = 14),  # Increase x-axis title font size
              axis.title.y = element_text(size = 14),  # Increase y-axis title font size
              plot.title = element_text(size = 12),    # Increase plot title font size
              legend.text = element_text(size = 12),    # Increase legend text font size
              legend.title = element_text(size = 12)    # Increase legend title font size
            ),
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "PFS & OS (%)",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           #fun=formula,
           legend.labs = c("PFS","OS"),
           surv.scale = "percent",
           censor=FALSE
           )

OS_EFS$plot <- OS_EFS$plot + 
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") + 
  geom_vline(xintercept = median(km_OS)[1], linetype = "dashed", color = "grey") + 
  geom_vline(xintercept = median(km_PFS)[1], linetype = "dashed", color = "grey") + 
  annotate("text", x = med_OS$median + 0.5, y = 0.85, label = paste(signif(med_OS$median, 2), "(", signif(med_OS$lower, 2), "-", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5) +
  annotate("text", x = med_PFS$median + 0.5, y = 0.95, label = paste(signif(med_PFS$median, 2), "(", signif(med_PFS$lower, 2), "-", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)

OS_EFS

Create KM for DOR

Show code
km_DOR <- survfit(Surv((Days.to.death.or.relapse.or.DLC-28)/30, relapse) ~ 1, data = dataset)
med_DOR <- surv_median(km_DOR)

DOR <- ggsurvplot(km_DOR,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Duration of response",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

DOR$plot <- DOR$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_DOR$median + 0.5, y = 0.54, label = paste(signif(med_DOR$median, 2), "(95% CI, ", signif(med_DOR$lower, 2), "to", signif(med_DOR$upper, 2),")"), hjust = 0,  size = 5)
DOR
Show code
km_DOR
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse) ~ 1, data = dataset)

      n events median 0.95LCL 0.95UCL
[1,] 25     22   17.1     7.8    26.6
Show code
summary(km_DOR,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse) ~ 1, data = dataset)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
   12     14      11     0.56  0.0993        0.396        0.793

Stratified survival analysis

Create KM for OS and PFS, stratify by HRCA

Show code
km_OS <- survfit(Surv(Days.to.death.or.DLC/30, death) ~ HRCA, data = dataset)
km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ HRCA, 
    data = dataset)

        n events median 0.95LCL 0.95UCL
HRCA=0 10      7   32.1    18.5      NA
HRCA=1 15     12   27.5    17.7      NA
Show code
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           legend.labs = c("Standard","High risk")
) 

#OS$plot <- OS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_OS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_OS$median, 2), "(95% CI, ", signif(med_OS$lower, 2), "to", signif(med_OS$upper, 2),")"), hjust = 0,  size = 5)

OS
Show code
km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ HRCA, data = dataset)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 
    HRCA, data = dataset)

        n events median 0.95LCL 0.95UCL
HRCA=0 10      8   20.6    7.33      NA
HRCA=1 15     14   14.0    8.73      NA
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           legend.labs = c("Standard","High risk")
)

#PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)

PFS

KM of OS & PFS, stratified by cell dose

Show code
km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ intended_cell_dose, data = dataset)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 
    intended_cell_dose, data = dataset)

                           n events median 0.95LCL 0.95UCL
intended_cell_dose=5e+07   7      6  18.00    5.87      NA
intended_cell_dose=1.5e+08 8      7  24.32   12.20      NA
intended_cell_dose=3e+08   7      6  23.20   12.63      NA
intended_cell_dose=4.5e+08 3      3   7.87    3.07      NA
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.4,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           #legend.labs = c("Standard","High risk")
)

PFS
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ intended_cell_dose, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.4,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ intended_cell_dose, 
    data = data1)

                           n events median 0.95LCL 0.95UCL
intended_cell_dose=5e+07   7      7   25.4    10.1      NA
intended_cell_dose=1.5e+08 8      4   58.4    27.5      NA
intended_cell_dose=3e+08   7      5   32.1    20.4      NA
intended_cell_dose=4.5e+08 3      3   18.5    16.6      NA

KM of PFS, dose level 1 vs 2-4

Show code
data1 <- dataset %>%
  mutate(
    dose_level = ifelse(intended_cell_dose == "5e+07","1","2-4")
  )

km_PFS <- survfit(Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ dose_level, data = data1)
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~ 
    dose_level, data = data1)

                n events median 0.95LCL 0.95UCL
dose_level=1    7      6   18.0    5.87      NA
dose_level=2-4 18     16   17.5    8.73    37.4
Show code
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("1","2-4"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black"),
           #legend.labs = c("Standard","High risk")
)

#PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") +  annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0,  size = 5)

PFS

Create KM for OS, stratified by sCR/CR vs VGPR/PR

Show code
data1 <- dataset %>%
  mutate(
    response.category = recode(best_response, "scr" = "sCR/CR", "cr" = "sCR/CR", "vgpr" = "VGPR/PR", "pr"="VGPR/PR")
  )

km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ response.category, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("sCR/CR","VGPR/PR"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ response.category, 
    data = data1)

                           n events median 0.95LCL 0.95UCL
response.category=sCR/CR  17     12   35.5    27.5      NA
response.category=VGPR/PR  8      7   19.1    17.1      NA
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-28)/30, relapse) ~ response.category, data = data1)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("sCR/CR","VGPR/PR"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30, 
    relapse) ~ response.category, data = data1)

                           n events median 0.95LCL 0.95UCL
response.category=sCR/CR  17     14  20.20   17.07    36.5
response.category=VGPR/PR  8      8   7.28    6.93      NA

Create KM for OS & PFS, stratified by treatment lines <8 vs >=8

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ prior.lines.8, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("<8","\u22658"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ prior.lines.8, data = data1)

                 n events median 0.95LCL 0.95UCL
prior.lines.8=0 11     10   12.6    8.37      NA
prior.lines.8=1 14     12   21.1   12.20      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ prior.lines.8, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("<8","\u22658"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ prior.lines.8, 
    data = data1)

                 n events median 0.95LCL 0.95UCL
prior.lines.8=0 11      7   20.4    17.7      NA
prior.lines.8=1 14     12   33.0    25.4      NA

Create KM for OS & PFS, stratified by hx of prior allo

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ allo, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ allo, data = data1)

        n events median 0.95LCL 0.95UCL
allo=0 20     18   16.0    8.07    31.7
allo=1  5      4   21.1   12.20      NA
Show code
summary(km_PFS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ allo, data = data1)

                allo=0 
        time       n.risk      n.event     survival      std.err 
      12.000       12.000        8.000        0.600        0.110 
lower 95% CI upper 95% CI 
       0.420        0.858 

                allo=1 
        time       n.risk      n.event     survival      std.err 
      12.000        4.000        1.000        0.800        0.179 
lower 95% CI upper 95% CI 
       0.516        1.000 
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ allo, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ allo, 
    data = data1)

        n events median 0.95LCL 0.95UCL
allo=0 20     15   27.5    20.4      NA
allo=1  5      4   61.5    17.7      NA
Show code
summary(km_OS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ allo, 
    data = data1)

                allo=0 
        time       n.risk      n.event     survival      std.err 
     12.0000      17.0000       3.0000       0.8500       0.0798 
lower 95% CI upper 95% CI 
      0.7071       1.0000 

                allo=1 
        time       n.risk      n.event     survival      std.err 
          12            5            0            1            0 
lower 95% CI upper 95% CI 
           1            1 

Create KM for OS & PFS, stratified by receipt of prior BCMA-directed therapy

Show code
data1 <- dataset %>%
  mutate(
    prior.lines.8 = ifelse(no_priortx >=8, 1,0)
  )

km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ any_bcma_tx, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ any_bcma_tx, data = data1)

               n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22     19   18.0    8.73    31.7
any_bcma_tx=1  3      3   12.2    5.87      NA
Show code
summary(km_PFS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ any_bcma_tx, data = data1)

                any_bcma_tx=0 
        time       n.risk      n.event     survival      std.err 
      12.000       14.000        8.000        0.636        0.103 
lower 95% CI upper 95% CI 
       0.464        0.873 

                any_bcma_tx=1 
        time       n.risk      n.event     survival      std.err 
      12.000        2.000        1.000        0.667        0.272 
lower 95% CI upper 95% CI 
       0.300        1.000 
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, 
    data = data1)

               n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22     17   27.5    20.4      NA
any_bcma_tx=1  3      2   32.1    10.1      NA
Show code
summary(km_OS,times=c(12))
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx, 
    data = data1)

                any_bcma_tx=0 
        time       n.risk      n.event     survival      std.err 
     12.0000      20.0000       2.0000       0.9091       0.0613 
lower 95% CI upper 95% CI 
      0.7966       1.0000 

                any_bcma_tx=1 
        time       n.risk      n.event     survival      std.err 
      12.000        2.000        1.000        0.667        0.272 
lower 95% CI upper 95% CI 
       0.300        1.000 

Create KM for OS & PFS, stratified by triple refractory disease

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ triple_ref, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ triple_ref, data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      5   12.2    8.37      NA
triple_ref=1 20     17   18.0    8.73    37.4
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, 
    data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      4   27.5    18.5      NA
triple_ref=1 20     15   32.1    20.4      NA

Create KM for OS & PFS, stratified by penta refractory disease

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ pentaref, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ pentaref, data = dataset)

            n events median 0.95LCL 0.95UCL
pentaref=0  8      7   16.0   12.20      NA
pentaref=1 17     15   21.1    8.07    37.4
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref, 
    data = dataset)

              n events median 0.95LCL 0.95UCL
triple_ref=0  5      4   27.5    18.5      NA
triple_ref=1 20     15   32.1    20.4      NA

Create KM for OS & PFS, stratified by tumor burden (BMPCs <=30 vs >30)

Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ High.tumor.burden, data = dataset)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ High.tumor.burden, data = dataset)

                     n events median 0.95LCL 0.95UCL
High.tumor.burden=0  8      7   24.3   18.00      NA
High.tumor.burden=1 17     15   12.6    8.37      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ High.tumor.burden, data = dataset)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ High.tumor.burden, 
    data = dataset)

                     n events median 0.95LCL 0.95UCL
High.tumor.burden=0  8      5   48.6    33.0      NA
High.tumor.burden=1 17     14   22.8    17.7      NA

Create KM for OS & PFS, stratified by sBCMA at day 90 (< vs >= median)

Show code
data1 <- dataset %>%
  filter(!is.na(sBCMA.d90))%>%
  filter(Days.to.death.or.relapse.or.DLC>=90) %>%
  mutate(
    sBCMA.high = ifelse(sBCMA.d90 >= median(sBCMA.d90),1,0)
  )

median(data1$sBCMA.d90)
[1] 2.915
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-90)/30, relapse) ~ sBCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 90)/30, 
    relapse) ~ sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 10     10  21.80   15.00      NA
sBCMA.high=1 10      8   7.28    4.33      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC-90)/30, death) ~ sBCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC - 90)/30, death) ~ 
    sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 10      7   55.4    30.0      NA
sBCMA.high=1 10      8   18.5    12.5      NA

Create KM for OS & PFS, stratified by sBCMA at day 60 (< vs >= median)

Show code
data1 <- dataset %>%
  filter(!is.na(sBCMA.d60))%>%
  filter(Days.to.death.or.relapse.or.DLC>=60) %>%
  mutate(
    sBCMA.high = ifelse(sBCMA.d60 >= median(sBCMA.d60),1,0)
  )

median(data1$sBCMA.d60)
[1] 5.415
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC-60)/30, relapse) ~ sBCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 60)/30, 
    relapse) ~ sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 12     11   19.1   10.63      NA
sBCMA.high=1 12     10   11.1    6.07      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC-60)/30, death) ~ sBCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC - 60)/30, death) ~ 
    sBCMA.high, data = data1)

              n events median 0.95LCL 0.95UCL
sBCMA.high=0 12      8   33.5    23.4      NA
sBCMA.high=1 12     10   17.1    13.5      NA

Create KM for OS & PFS, stratified by BCMA ABC at screening

Show code
data1 <- dataset %>%
  filter(!is.na(bcma_scrn))%>%
  filter(Days.to.death.or.relapse.or.DLC>=60) %>%
  mutate(
    BCMA.high = ifelse(bcma_scrn >= median(bcma_scrn),1,0)
  )

median(data1$bcma_scrn)
[1] 620
Show code
km_PFS <- survfit(Surv((Days.to.death.or.relapse.or.DLC)/30, relapse) ~ BCMA.high, data = data1)
med_PFS <- surv_median(km_PFS)

PFS <- ggsurvplot(km_PFS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Progression-free survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

PFS
Show code
km_PFS
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30, 
    relapse) ~ BCMA.high, data = data1)

             n events median 0.95LCL 0.95UCL
BCMA.high=0 12     11   13.3    8.07      NA
BCMA.high=1 13     11   21.1    8.37      NA
Show code
km_OS <- survfit(Surv((Days.to.death.or.DLC)/30, death) ~ BCMA.high, data = data1)
med_OS <- surv_median(km_OS)

OS <- ggsurvplot(km_OS,
           pval=TRUE,
           conf.int = TRUE,
           risk.table = TRUE, # Add risk table
           fontsize = 6,
           risk.table.col = "strata", # Change risk table color by groups
           tables.height = 0.25,
           tables.theme = theme_cleantable(),
           #surv.median.line = "hv", # Specify median survival
           #ggtheme = theme_bw(), # Change ggplot2 theme
           #palette = c("#E7B800", "#2E9FDF"),
           xlab="Time (months)", ylab = "Overall survival",
           xlim = c(0,65), break.x.by = c(12),
           ylim = c(0,1), break.y.by = c(0.25),
           legend.labs = c("Low","High"),
           legend = "none",
           surv.scale="percent",
           font.main = c(16, "plain", "black"),
           font.x = c(16, "plain", "black"),
           font.y = c(16, "plain", "black"),
           font.caption = c(16, "plain", "black"),
           font.tickslab = c(16, "plain", "black")
)

OS
Show code
km_OS
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ BCMA.high, 
    data = data1)

             n events median 0.95LCL 0.95UCL
BCMA.high=0 12      8   22.8    18.5      NA
BCMA.high=1 13     11   35.5    17.7      NA

Regression analysis

Cox regression

Show code
theme_gtsummary_compact()
preds <- c("HRCA", "cnLOH", "response.category", "intended_cell_dose", "High.tumor.burden","any_bcma_tx","pentaref","triple_ref", "sBCMA.d90", "sBCMA.d60")

data1 <- dataset %>%
  mutate(
    response.category = recode(best_response, "scr" = "sCR/CR", "cr" = "sCR/CR", "vgpr" = "VGPR/PR", "pr"="VGPR/PR"),
    intended_cell_dose = log10(intended_cell_dose)
  )


uv_tab_OS <- tbl_uvregression(
  data1[c(preds)],
  method = coxph,
  y = Surv(data1$Days.to.death.or.DLC, data1$death),
  exponentiate = TRUE
) %>%
  sort_p()

uv_tab_PFS <- tbl_uvregression(
  data1[c(preds)],
  method = coxph,
  y = Surv(data1$Days.to.death.or.relapse.or.DLC, data1$relapse),
  exponentiate = TRUE
)


tbl_merge(list(uv_tab_OS, uv_tab_PFS), tab_spanner = c("**OS**", "**PFS**"))
Characteristic OS PFS
N HR1 95% CI1 p-value N HR1 95% CI1 p-value
sBCMA.d90 21 1.12 1.03, 1.22 0.006 21 1.10 1.00, 1.21 0.045
sBCMA.d60 24 1.04 1.01, 1.07 0.007 24 1.04 1.01, 1.08 0.018
response.category 25


25


    sCR/CR



    VGPR/PR
3.22 1.15, 9.06 0.027
2.01 0.82, 4.95 0.13
High.tumor.burden 25 2.97 0.96, 9.21 0.059 25 2.65 0.92, 7.66 0.072
intended_cell_dose 25 1.80 0.35, 9.17 0.5 25 0.82 0.18, 3.67 0.8
cnLOH 22 1.23 0.42, 3.59 0.7 22 0.99 0.36, 2.69 >0.9
pentaref 25 0.85 0.31, 2.33 0.8 25 0.72 0.28, 1.85 0.5
triple_ref 25 0.91 0.30, 2.81 0.9 25 0.65 0.24, 1.81 0.4
HRCA 25 0.95 0.36, 2.50 >0.9 25 1.31 0.55, 3.16 0.5
any_bcma_tx 25 1.09 0.24, 4.85 >0.9 25 1.92 0.54, 6.76 0.3
1 HR = Hazard Ratio, CI = Confidence Interval

Scatterplot

TTR by BCMA ABC at baseline in relapsed patients

Show code
data1 <- dataset %>%
  filter(relapse == 1) %>%
  transmute(
    bcma_scrn = log(bcma_scrn),
    time.to.relapse = Days.to.death.or.relapse.or.DLC/30
  )

ggplot(data1, aes(x=time.to.relapse, y = bcma_scrn)) + 
  geom_point(shape = 16) + # Add points to the plot with shape 16 (i.e., basic circle)
  theme_classic() + # Use the minimal theme
  geom_smooth(aes(x = time.to.relapse, y=bcma_scrn), method = "lm", se = TRUE, color = "#104a8e", inherit.aes = FALSE, linetype = "solid", size = 0.5)+
  stat_cor(method = "pearson", label.x = 3, label.y = 9) +
  labs(x = "Time to relapse (months)", y = "log(BCMA ABC)")

Probability plots

Hazard of OS vs sBCMA d90

Show code
data1 <- dataset %>%
  select(sBCMA.d90, Days.to.death.or.DLC, death) %>%
  filter(!is.na(sBCMA.d90))%>%
  mutate(
    sBCMA.high = ifelse(sBCMA.d90 >= median(sBCMA.d90),1,0)
  )



dd <- datadist(data1)
options(datadist='dd')

S <- Surv(data1$Days.to.death.or.DLC, data1$death)
f <- cph(S ~ sBCMA.d90, x=TRUE, y=TRUE,surv=TRUE,data=data1)

model <- Predict(f, sBCMA.d90, fun=function(x) exp(x) )

ggplot(as.data.frame(model),aes(x=sBCMA.d90, y=yhat)) + 
  geom_ribbon(data = model, aes(ymin=lower, ymax=upper), alpha=0.2, linetype=0) + 
  geom_line() + 
  theme_bw() + 
  labs(
    x = "sBCMA d90",
    y = "OS (hazard)") +
  theme(title = element_text(size=16,face="bold"),legend.title=element_blank())

Hazard of OS vs screening BCMA ABC

Show code
data1 <- dataset %>%
  select(bcma_scrn, Days.to.death.or.DLC, death)



dd <- datadist(data1)
options(datadist='dd')

S <- Surv(data1$Days.to.death.or.DLC, data1$death)
f <- cph(S ~ rcs(bcma_scrn,3), x=TRUE, y=TRUE,surv=TRUE,data=data1)

model <- Predict(f, bcma_scrn, fun=function(x) exp(x) )

ggplot(as.data.frame(model),aes(x=bcma_scrn, y=yhat)) + 
  geom_ribbon(data = model, aes(ymin=lower, ymax=upper), alpha=0.2, linetype=0) + 
  geom_line() + 
  theme_bw() + 
  labs(
    x = "sBCMA d90",
    y = "OS (hazard)") +
  theme(title = element_text(size=16,face="bold"),legend.title=element_blank())